//
//  NSString+DM_DES.m
//  24-加密
//
//  Created by dllo on 16/8/16.
//  Copyright © 2016年 DM.C. All rights reserved.
//

#import "NSString+DM_DES.h"
#import <CommonCrypto/CommonCrypto.h>
#import "NSString+DM_Base64.h"
// 密钥的key必须得8位
#define key @"01234567"
// 向量
static Byte iv[] = {1, 2, 3, 4, 5, 6, 7, 8};
@implementation NSString (DM_DES)
- (NSString *)stringWithDES {
    // 1.将字符串转化成C字符串
    const char *cString = [self UTF8String];
    // 2.接收容器
    unsigned char byte[1024];
    // 3.容器大小
    size_t dataOutMoved = 0;
    // 4.DES加密过程
    // 参数1: 加密/解密
    // 参数2: 加密/解密 方式
    // 参数3: 分组密码的选项(枚举)
    // 参数4: 密钥(key)
    // 参数5: key(密钥)的大小
    // 参数6: 向量
    // 参数7: C的字符串
    // 参数8: 字符串长度
    // 参数9: 接收容器
    // 参数10: 容器大小
    // 参数11: 容器最终的个数
    CCCryptorStatus cryptorStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, cString, strlen(cString), byte, 1024, &dataOutMoved);
    // 5.判断是否成功
    if (cryptorStatus == kCCSuccess) {
        NSLog(@"加密成功");
        // 转换成Base64格式的字符串并返回
        NSData *desData = [NSData dataWithBytes:byte length:dataOutMoved];
        NSString *desBase64String = [desData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
        return desBase64String;
    } else {
        NSLog(@"加密失败");
        return nil;
    }
    
}
- (NSString *)desWithString {
    NSData *data = [self base64StringWithData];
    
    const void *byte = data.bytes;
    unsigned char buffer[1024];
    
    size_t dataOutMoved = 0;
    CCCryptorStatus cryptorStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, byte, strlen(byte), buffer, 1024, &dataOutMoved);
    if (cryptorStatus == kCCSuccess) {
        NSLog(@"解密成功");
        NSData *sourceData = [[NSData alloc] initWithBytes:buffer length:dataOutMoved];
        NSString *sourceString = [[NSString alloc] initWithData:sourceData encoding:NSUTF8StringEncoding];
        return sourceString;
    } else {
        NSLog(@"解密失败");
        return @"";
    }
    
}
@end
